from django.conf import settings
from urllib.parse import urlencode, parse_qs
from urllib.request import urlopen
import json


class OauthQQTool(object):
    def get_auth_url(self):
        # 1. base_url
        # GET www.baidu.com/a.html?a=xxx&b=xxx
        # ? 是为了将路径和参数进行分割
        base_url = 'https://graph.qq.com/oauth2.0/authorize?'

        # 2. 将参数放在字典中
        params = {
            'response_type': 'code',
            'client_id': settings.QQ_APP_ID,
            'redirect_uri': settings.QQ_REDIRECT_URL,
            'state': '/',
        }

        # 3.
        # 将query字典转换为url路径中的查询字符串
        auth_url = base_url + urlencode(params)

        return auth_url

    def get_access_token_by_code(self,code):
        # PC网站：https://graph.qq.com/oauth2.0/token
        # GET
        # grant_type      必须      授权类型，在本步骤中，此值为“authorization_code”。
        # client_id       必须      申请QQ登录成功后，分配给网站的appid。
        # client_secret   必须      申请QQ登录成功后，分配给网站的appkey。
        # code            必须      上一步返回的authorization
        # redirect_uri    必须      与上面一步中传入的redirect_uri保持一致。
        base_url = 'https://graph.qq.com/oauth2.0/token?'
        params = {
            'grant_type': 'authorization_code',
            'client_id': settings.QQ_APP_ID,
            'client_secret': settings.QQ_APP_KEY,
            'code': code,
            'redirect_uri': settings.QQ_REDIRECT_URL,
        }
        url = base_url + urlencode(params)
        response = urlopen(url)
        data = response.read().decode()
        # print(data)
        acecess_data = parse_qs(data)
        token = acecess_data.get('access_token')[0]
        print(token)
        return token


    def get_openid_by_token(self, token):
        """
        PC网站：https://graph.qq.com/oauth2.0/me
        2 请求方法
        GET
        3 请求参数
        请求参数请包含如下内容：
        参数	是否必须	含义
        access_token	必须	在Step1中获取到的access token。

        """

        # 1. base_url
        base_url = 'https://graph.qq.com/oauth2.0/me?'
        # 2. 参数
        params = {
            'access_token': token
        }
        # 3. url
        url = base_url + urlencode(params)
        # 4. 根据url获取数据
        response = urlopen(url)

        data = response.read().decode()

        # print(data)
        # 5. 解析数据
        # 因为它返回的数据 不是 字典类型,我们要想获取 字典数据,需要对这个字符串进行截取
        # 'callback( {"client_id":"101474184","openid":"483C55DADEF65CC5735695CBC262F979"} );'
        try:
            openid_data = json.loads(data[10:-4])
        except Exception:
            raise Exception('数据获取错误')

        # print(openid_data)

        return openid_data['openid']




